package com.web.kdl.service.siteWheel;

import cn.hutool.core.bean.BeanUtil;
import com.alibaba.excel.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.web.kdl.daoV2.matrix.MatrixDao;
import com.web.kdl.daoV2.site.SiteDao;
import com.web.kdl.daoV2.siteWheel.SiteWheelDao;
import com.web.kdl.entity.site.Site;
import com.web.kdl.entity.sitewheel.SiteWheel;
import com.web.kdl.pojo.Bo.MatrixBo;
import com.web.kdl.pojo.Vo.SiteAndWheelInfo;
import com.web.kdl.pojo.Vo.SiteWheelVo;
import com.web.kdl.pojo.Vo.WheelVo;
import com.web.kdl.pojo.dto.*;
import com.web.kdl.service.flywheel.FlyWheelService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**
 * @Author： shulibin
 * @Date： 2025/7/30 9:34
 * @Describe：
 */
@Service
public class SiteWheelServiceImpl implements SiteWheelService{
    private static final Logger log = LoggerFactory.getLogger(SiteWheelServiceImpl.class);
    @Resource
    SiteWheelDao siteWheelDao;
    @Resource
    SiteDao siteDao;
    @Resource
    MatrixDao matrixDao;
    @Autowired
    FlyWheelService flyWheelService;
    @Override
    public TreeSet<SiteWheelVo> getAllSite() {
//      获取 SiteWheel 表中 sumSite 去重列 按照sum_site 升序
        List<Site> sites = siteDao.selectList(new LambdaQueryWrapper<Site>().select(Site::getId, Site::getSumSite).orderByAsc(Site::getSumSite));
        TreeSet<SiteWheelVo> collect = sites.stream()
                .map(siteWheel -> new SiteWheelVo(siteWheel.getId(), siteWheel.getSumSite()))
                .collect(Collectors.toCollection(TreeSet::new));
        return collect;
    }

    @Override
    public List<WheelVo> getAllSiteWheel() {
        //      获取 SiteWheel 表中 sumSite 去重列 按照sum_site 升序
        List<MatrixBo> matrixList = matrixDao.selectMatrixTable();
        ArrayList<WheelVo> wheelVos = new ArrayList<>();
        for(MatrixBo matrixBo : matrixList){
            for (int i = 1; i <=matrixBo.getFlywheelSerial() ; i++) {
                WheelVo wheelVo = new WheelVo(matrixBo.getMatrixId(), matrixBo.getSiteName(), matrixBo.getMatrixName(), "flywheel" + i);
                wheelVos.add(wheelVo);
            }
            WheelVo wheelVo= new WheelVo(matrixBo.getMatrixId(), matrixBo.getSiteName(), matrixBo.getMatrixName(), "总控");
            wheelVos.add(wheelVo);
        }

        return wheelVos;
    }

    @Override
    public List<SiteWheel> getSiteWheelInfo() {
        return siteWheelDao.selectList(null);
    }

    @Override
    public SiteWheel getInfoBySiteIdAndWheelSerial(int siteId, int flyWheelSerial) {
        LambdaQueryWrapper<SiteWheel> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SiteWheel::getSiteId, siteId).eq(SiteWheel::getFlywheelSerial, flyWheelSerial);
        return siteWheelDao.selectOne(queryWrapper);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addSiteWheel(AddSiteWheelDto addSiteWheelDto) {
        if(StringUtils.isBlank(addSiteWheelDto.getSumSite())){
            //若站点为空，则查询站点名称
            Site site = siteDao.selectById(addSiteWheelDto.getSiteId());
            addSiteWheelDto.setSumSite(site.getSumSite());
        }
        List<SiteWheel> siteWheels1 = siteWheelDao.selectList(new LambdaQueryWrapper<SiteWheel>().eq(SiteWheel::getSiteId, addSiteWheelDto.getSiteId()).eq(SiteWheel::getSubSite, addSiteWheelDto.getSubSite()));
        if (!siteWheels1.isEmpty()){
            throw new RuntimeException("该站点下已存在该飞轮");
        }
        SiteWheel siteWheel = new SiteWheel();
        BeanUtil.copyProperties(addSiteWheelDto, siteWheel);
        //获取当前时间
        siteWheel.setTime(String.valueOf(LocalDateTime.now()));
        //该站点已使用的飞轮序号
        List<SiteWheel> siteWheels = siteWheelDao.selectList(new LambdaQueryWrapper<SiteWheel>().select(SiteWheel::getFlywheelSerial).eq(SiteWheel::getSiteId, siteWheel.getSiteId()));
        List<Integer> flywheelSerialList = new ArrayList<>();
        siteWheels.forEach(item -> flywheelSerialList.add(item.getFlywheelSerial()));
        //可以的飞轮序号1~247
        for (int i = 1; i <= 247; i++) {
            if(!flywheelSerialList.contains(i)){
                siteWheel.setFlywheelSerial(i);//设置飞轮序号
                break;
            }
        }
        if (siteWheel.getFlywheelSerial()==null){
            throw new RuntimeException("该站点下的飞轮序号已达上限");
        }
        int insert = siteWheelDao.insert(siteWheel);
        if (insert<=0){
            throw new RuntimeException("添加飞轮失败");
        }
    }


    @Override
    public int deleteSiteWheel(int siteId, int flywheelSerial) {
        LambdaQueryWrapper<SiteWheel> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SiteWheel::getSiteId, siteId).eq(SiteWheel::getFlywheelSerial, flywheelSerial);
        SiteWheel siteWheel = siteWheelDao.selectOne(queryWrapper);
        int i = siteWheelDao.delete(queryWrapper);
        if(i<=0){
            throw new RuntimeException("删除失败");
        }
        return 1;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deleteSiteWheelById(int id) {
        SiteWheel siteWheel = siteWheelDao.selectById(id);
        int i = siteWheelDao.deleteById(id);
        if(i<=0){
            throw new RuntimeException("删除失败");
        }
        return 1;
    }

    @Override
    public int updateSiteWheel(EditSiteWheelDto editSiteWheelDto) {
        //获取飞轮信息
        SiteWheel siteWheel = siteWheelDao.selectOne(new LambdaQueryWrapper<SiteWheel>().eq(SiteWheel::getSiteId, editSiteWheelDto.getSiteId()).eq(SiteWheel::getFlywheelSerial, editSiteWheelDto.getFlywheelSerial()));
        if (siteWheel==null){
            throw new RuntimeException("飞轮不存在");
        }
        BeanUtil.copyProperties(editSiteWheelDto, siteWheel);
        return siteWheelDao.updateById(siteWheel);
    }

    @Override
    public int updateSiteWheelById(EditSiteWheelByIdDto editSiteWheelByIdDto) {
        SiteWheel siteWheel = siteWheelDao.selectById(editSiteWheelByIdDto.getId());
        if (siteWheel==null){
            throw new RuntimeException("飞轮不存在");
        }
        BeanUtil.copyProperties(editSiteWheelByIdDto, siteWheel);
        return siteWheelDao.updateById(siteWheel);
    }
    @Override
    public List<SiteWheel> getWheelBySiteId(int siteId) {
        return siteWheelDao.selectList(new LambdaQueryWrapper<SiteWheel>().eq(SiteWheel::getSiteId, siteId));
    }

    @Override
    public List<SiteAndWheelInfo> getSiteAndWheelInfo() {
        List<Site> sites = siteDao.selectList(null);
        ArrayList<SiteAndWheelInfo> siteAndWheelInfos = new ArrayList<>(sites.size());
        sites.forEach(site -> {
            SiteAndWheelInfo siteAndWheelInfo = new SiteAndWheelInfo();
            BeanUtil.copyProperties(site, siteAndWheelInfo);
            siteAndWheelInfo.setWheels(getWheelBySiteId(site.getId()));
            siteAndWheelInfos.add(siteAndWheelInfo);
        });
        return siteAndWheelInfos;
    }
}
